import { CartItemDTO } from '@/services/cart.ts';
import { useMemo } from 'react';
import { create } from 'zustand';

type CartStore = {
  cart: CartItemDTO[];
  addToCart(cartItem: CartItemDTO): void;
  modifyCartItems(cartItems: CartItemDTO[]): void;
  removeCartItems(ids: number[]): void;
  setCart(cartItems: CartItemDTO[]): void;
};

const useCartStore = create<CartStore>((set, get) => ({
  cart: [],
  addToCart(cartItem: CartItemDTO) {
    const storeCart = get().cart;

    const item = storeCart.find((item) => {
      return item.skuId === cartItem.skuId;
    });
    if (!item) {
      set({
        cart: [...storeCart, cartItem]
      });
    } else {
      item.quantity += cartItem.quantity;
      set({
        cart: [...storeCart]
      });
    }
  },
  modifyCartItems(cartItems: CartItemDTO[]) {
    const storeCart = get().cart;

    cartItems.forEach((item) => {
      const { skuId, quantity, isChecked } = item;
      const existingItem = storeCart.find((item) => item.skuId === skuId);
      if (existingItem) {
        existingItem.quantity = quantity;
        existingItem.isChecked = isChecked;
      }
    });

    set({
      cart: [...storeCart]
    });
  },
  removeCartItems(ids: number[]) {
    const storeCart = get().cart;

    const cartItems = storeCart.filter((item) => {
      return !ids?.includes(item.skuId);
    });

    set({
      cart: cartItems
    });
  },
  setCart(cartItems: CartItemDTO[]) {
    set({
      cart: cartItems
    });
  }
}));

export default useCartStore;

export function useCartItems(onlyChecked = false) {
  const cart = useCartStore((state) => state.cart);

  return useMemo(() => {
    return onlyChecked ? cart.filter((item) => item.isChecked) : cart;
  }, [cart, onlyChecked]);
}
